package new_element

import (
	"clientDemo/ui/fyne_ui/common"
	widget2 "clientDemo/ui/fyne_ui/widget"
	widgetcommon "clientDemo/ui/fyne_ui/widget/interface"
	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/widget"
)

// NewElementPage 新建页面类
type NewElementPage struct {
	window  fyne.Window
	content fyne.CanvasObject
	title   string
	width   float32
	height  float32
	onClose func()

	// 新增字段用于控件创建
	onWidgetCreated func(widgetcommon.IWidgetItem) // 控件创建后的回调
	emptyWidget     widgetcommon.IWidgetItem       // 当前场景的根控件
}

// NewNewElement 创建新的页面
func NewNewElement(app fyne.App, title string, width, height float32, emptyWidget widgetcommon.IWidgetItem, onWidgetCreated func(widgetcommon.IWidgetItem)) *NewElementPage {
	page := &NewElementPage{
		title:           title,
		width:           width,
		height:          height,
		emptyWidget:     emptyWidget,
		onWidgetCreated: onWidgetCreated,
	}

	// 创建新窗口
	page.window = app.NewWindow(title)
	page.window.Resize(fyne.NewSize(width, height))

	// 设置窗口位置在200,200
	page.window.CenterOnScreen()

	// 设置为子窗口，避免关闭时退出主程序
	page.window.SetCloseIntercept(func() {
		page.window.Hide() // 隐藏窗口而不是关闭
	})

	// 创建页面内容
	page.createContent()

	// 设置窗口内容
	page.window.SetContent(page.content)

	// 设置窗口关闭事件
	page.window.SetOnClosed(func() {
		if page.onClose != nil {
			page.onClose()
		}
	})

	return page
}

// createContent 创建页面内容
func (p *NewElementPage) createContent() {
	// 动态创建按钮列表
	var buttons []fyne.CanvasObject

	// 遍历SkinManager中的所有皮肤，为每个皮肤创建按钮
	for skinName, skinInfo := range common.Get().GetAllSkins() {
		button := widget.NewButton(skinInfo.GetSkinName(), func(name string, skinName string) func() {
			return func() {
				// 创建新控件
				p.createNewWidget(name, skinName)
				// 关闭窗口
				p.Close()
			}
		}(skinInfo.GetSkinName(), skinName))
		buttons = append(buttons, button)
	}

	// 创建按钮容器 - 使用网格布局，每行8个按钮
	buttonContainer := container.NewGridWithColumns(8, buttons...)

	// 创建滚动容器，防止按钮过多时超出窗口
	scrollContainer := container.NewScroll(buttonContainer)
	scrollContainer.SetMinSize(fyne.NewSize(580, 350)) // 设置滚动区域大小

	// 创建主容器
	p.content = container.NewVBox(
		scrollContainer,
		widget.NewSeparator(),
		widget.NewLabel("选择一个控件类型来添加到场景中。"),
	)
}

// createNewWidget 创建新控件
func (p *NewElementPage) createNewWidget(widgetName, skinName string) {
	if p.emptyWidget == nil {
		return
	}

	// 获取皮肤信息
	skinInfo := common.Get().GetSkin(skinName)
	if skinInfo == nil {
		return
	}

	// 直接在主场景的emptyWidget上创建控件，使用皮肤信息
	newWidget := widget2.CreatWidgetByName(widgetName, skinInfo.GetBaseWidgetName(), skinInfo, p.emptyWidget)
	if newWidget != nil {
		// 将新控件添加到主场景中
		p.emptyWidget.AddWidgetChild(newWidget, fyne.NewPos(100, 100))

		widget2.UpdateProperty(p.emptyWidget, newWidget, skinInfo.GetAttribute(), true)
		widget2.UpdateProperty(p.emptyWidget, newWidget, skinInfo.GetAllProperty(), true)
		// 调用回调函数通知控件已创建
		if p.onWidgetCreated != nil {
			p.onWidgetCreated(newWidget)
		}
	}
}

// Show 显示页面
func (p *NewElementPage) Show() {
	p.window.Show()
}

// Hide 隐藏页面
func (p *NewElementPage) Hide() {
	p.window.Hide()
}

// Close 关闭页面
func (p *NewElementPage) Close() {
	p.window.Hide() // 隐藏窗口而不是关闭，避免退出主程序
}

// SetOnClose 设置关闭回调
func (p *NewElementPage) SetOnClose(fn func()) {
	p.onClose = fn
}

// GetWindow 获取窗口对象
func (p *NewElementPage) GetWindow() fyne.Window {
	return p.window
}

// GetContent 获取内容容器
func (p *NewElementPage) GetContent() fyne.CanvasObject {
	return p.content
}

// AddButton 添加按钮到页面
func (p *NewElementPage) AddButton(text string, callback func()) *widget.Button {
	button := widget.NewButton(text, callback)
	// 注意：这里需要重新创建容器来添加新元素
	// 在实际使用中，你可能需要更复杂的容器管理
	return button
}

// AddLabel 添加标签到页面
func (p *NewElementPage) AddLabel(text string) *widget.Label {
	label := widget.NewLabel(text)
	// 注意：这里需要重新创建容器来添加新元素
	// 在实际使用中，你可能需要更复杂的容器管理
	return label
}

// AddSeparator 添加分隔符到页面
func (p *NewElementPage) AddSeparator() {
	//separator := widget.NewSeparator()
	// 注意：这里需要重新创建容器来添加新元素
	// 在实际使用中，你可能需要更复杂的容器管理
}

// SetTitle 设置页面标题
func (p *NewElementPage) SetTitle(title string) {
	p.title = title
	p.window.SetTitle(title)
}

// GetTitle 获取页面标题
func (p *NewElementPage) GetTitle() string {
	return p.title
}
